home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_03
/
9n03107a
< prev
next >
Wrap
Text File
|
1991-01-14
|
4KB
|
176 lines
#include <stdio.h>
#include <bios.h>
#include <string.h>
#define LIMIT 70000L
#define INIT \
long i; \
long t = biostime(0,0)
#define TEST(x) \
INIT; \
for(i=0; i<LIMIT; i++){ \
x; \
} \
return (int)(biostime(0,0)-t)
#define Access(x,y) \
printf("Accessing %s(): result = %d\n", #x,
elapsed[y]=x() )
typedef struct anything
{
char field1[50],
field2[50],
field3[50],
field4[50];
} anything;
anything s_object, *s_pointer=&s_object;
char *DestArray[4];
char *SourceArray[4];
char *access;
int j=0;
enum list { STRUCTURE, ARRAY, BOTH, EMPTY, ONELOOP,
TWOLOOPS, S_OBJECT };
int UsingS_Object(void)
{
TEST( access = (char *)&s_object.field1;
access = (char *)&s_object.field2;
access = (char *)&s_object.field3;
access = (char *)&s_object.field4;);
}
int UsingStructure(void)
{
TEST( access = s_pointer->field1;
access = s_pointer->field2;
access = s_pointer->field3;
access = s_pointer->field4; );
int UsingArray(void)
{
TEST( access = SourceArray[0];
access = SourceArray[1];
access = SourceArray[2];
access = SourceArray[3]; );
}
zint UsingStrucAndArrayBoth(void)
{
TEST( access = s_pointer->field1;
access = s_pointer->field2;
access = s_pointer->field3;
access = s_pointer->field4;
access = SourceArray[0];
access = SourceArray[1];
access = SourceArray[2];
access = SourceArray[3]; );
}
int EmptyLoop(void)
{
TEST( ; );
}
int LoopToLoop(void)
{
TEST( for(j=0; j<4; j++){ DestArray[j] =
SourceArray[j]; } );
}
int OneLoop(void)
{
TEST( for(j=0; j<4; j++){ access = SourceArray[j]; } );
}
void analyze(int *times)
{
int total = times[STRUCTURE] + times[ARRAY];
int difference = total - times[BOTH];
printf("\n1. Sum of time for (UsingStructure + \
UsingArray) = %d\n", total );
printf("2. Sum less time for both in one loop = %d\n",
difference );
printf("3. Time to do an empty loop = %d\n",
times[EMPTY] );
printf("4. Error (item 3 less item 2 should be near \
zero) = %d\n",
times[EMPTY]-difference );
}
void CompareAccessTimes(void)
{
int elapsed[10];
Access(UsingS_Object,S_OBJECT);
Access(UsingStructure,STRUCTURE);
Access(UsingArray, ARRAY );
Access(UsingStrucAndArrayBoth, BOTH);
Access(EmptyLoop, EMPTY);
Access(LoopToLoop,TWOLOOPS);
Access(OneLoop,ONELOOP);
analyze(elapsed);
}
void VerifyContents(void)
{
int i;
puts("The data to be accessed is as follows:\n");
/*
printf("The structure contains the following...\n");
printf("\t%s\n\t%s\n\t%s\n\t%s\n",
s_pointer->field1,
s_pointer->field2,
s_pointer->field3,
s_pointer->field4);
*/
printf("\nThe array provides access to...\n");
for(i=0; i<4; i++)
{
printf("\t%s\n", SourceArray[i] );
}
puts("\nEach function returns the count of clock ticks."\
"The lower the better.\n);
}
void main(void)
{
printf("In this example, the size of a data pointer is %d,",
sizeof(char*));
printf("and the size\nof a function pointer is %d\n",
sizeof(main) );
/* initialize the structure */
strcpy(s_pointer->field1,"This is field one");
strcpy(s_pointer->field2,"Here's the second field");
strcpy(s_pointer->field3,"Field Three at your service");
strcpy(s_pointer->field4,"Art was here");
/* initialize the purportedly slower array */
SourceArray[0] = s_pointer->field1;
SourceArray[0] = s_pointer->field2;
SourceArray[0] = s_pointer->field3;
SourceArray[0] = s_pointer->field4;
VerifyContents();
CompareAccessTimes();
}